package com.briup.cms.exception;

import com.briup.cms.utils.Message;
import com.briup.cms.utils.MessageStatus;
import com.briup.cms.utils.MessageUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

// 使spring中的AOP功能：可以将其类中的方法植入我们的代码中
@RestControllerAdvice
public class GlobalExceptionHandler {

    //创建了一个日志对象，通过调用日志对象的方法实现日志记录功能
    private Logger logger = LoggerFactory.getLogger(LoginException.class);
    private Logger logger2 = LoggerFactory.getLogger(CategoryException.class);
    //可以对指定的异常类型对象进行处理
    //当程序运行发生异常后，自动调用该方法，并将异常作为参数，传递给它
   // @ExceptionHandler(value={Exception.class,ServiceException.class})
    @ExceptionHandler(value = {Exception.class,CustomerException.class,LoginException.class})
    public Message handlerException(Exception e){

        // 当异常发生时，执行该方法 返回错误json字符串
         // e.printStackTrace();

        if(e instanceof CustomerException){
            //用户自定义异常
            CustomerException exception = (CustomerException) e;
            return  MessageUtil.error(exception.getMessageStatus());
        }

        if(e instanceof LoginException){
            // 登陆接口异常
            /**
             * 分类处理不同接口的异常：
             *      假设多次异常错误登陆进行对应处理（实现不同接口错误的不同处理操作）
             */
            LoginException exception = (LoginException) e;
            return  MessageUtil.error(exception.getMessageStatus());
        }
        //1.获取一个异常信息 e.getMessage()
        return MessageUtil.error(MessageStatus.SYSTEM_INNER_ERROR);
    }

    // 其他异常处理 value 用于指定 异常类型
//    DataAccessException.class
    @ExceptionHandler(value = {CategoryException.class})
    public Message CategoryExceptionMethod(Exception e){

        // e.printStackTrace();

        if(e instanceof CategoryException){
            CategoryException exception =(CategoryException)e;
            return MessageUtil.error(exception.getMessageStatus());
        }
        return MessageUtil.error(e.getMessage());
    }

}
